/**
 * \file video.c
 * \author Davide Gessa
 * \date 10-12-09
 */
#include <video.h>
#include <util.h>


uint8_t video_x = 0;		///< Cursore x
uint8_t video_y = 0;		///< Cursore y


/**
 * Visualizza un carattere nello schermo
 * 
 * \param ch carattere da stampare
 */
void video_putchar(uint8_t ch)
{
	char *vidmem = (char *) VIDEO_MEM;
	unsigned int i = 0;
	int x;

	// Calcola la posizione nel buffer video
	i = (video_y * VIDEO_MAX_X * 2) + (video_x * 2);
	
	// Esaminiamo il carattere
	switch(ch)
	{
		// A capo
		case '\n':
			video_y++;
			video_x = 0;
			break;
		
		// Tab
		case '\t':
			for(x = 0; x < VIDEO_TAB_DIM; x++)
				video_putchar(' ');
			break;

		// Carattere normale
		default:
			vidmem[i] = ch;
			i++;
			vidmem[i] = video_std_color;
			video_x++;
			break;
	}


	// Controlla se le posizioni x e y hanno superato i limiti
	if(video_y >= VIDEO_MAX_Y)
		//video_scrool_dw();
		
	if(video_x >= VIDEO_MAX_X)
	{
		video_y++;
		video_x = 0;
	}
}



/**
 * Visualizza un int nello schermo
 * 
 * \param num intero da visualizzare
 */
void video_putint(int num)
{
	video_puts(itoa(num));
}



/**
 * Mostra una stringa su schermo
 * 
 * \param str stringa da visualizzare
 */
void video_puts(uint8_t *str)
{
	while(*str != '\0')
	{
		video_putchar(*str);
		str++;
	}	
}



/**
 * Muove il cursore nella data posizione
 * 
 * \param x posizione asse x
 * \param y posizione asse y
 */
void video_gotoxy(uint8_t x, uint8_t y)
{
	video_x = x;
	video_y = y;
}



/**
 * Pulisce lo schermo
 */
void video_clear()
{
	unsigned char *vidmem = (unsigned char *) VIDEO_MEM;
	int i = 0;

	while(i < (VIDEO_MAX_X * VIDEO_MAX_Y * 2))
	{
		vidmem[i] = ' ';
		i++;
		vidmem[i] = video_std_color;
		i++;
	}
	video_gotoxy(0,0);
}



/**
 * Imposta il colore di default
 * 
 * \param cl colore da impostare
 */
void video_set_color(vcolor_t cl)
{
	video_std_color = cl;
}



/**
 * Visualizza una stringa con un determinato colore
 * 
 * \param cl colore da usare
 * \param str stringa da stampare
 */
void video_puts_colored(vcolor_t cl, uint8_t *str)
{
	uint8_t dc = video_std_color;
	video_set_color(cl);
	video_puts(str);
	video_set_color(dc);
}
